﻿using BLevy.Entidad;
using BLevy.Negocio;
using BLevy.UI.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmCuponConsulta : Form
    {
        public frmCuponConsulta()
        {
            InitializeComponent();
        }

        private void IniciarControles()
        {
            txtNroCupon.Text = string.Empty;
            txtNroSocio.Text = string.Empty;
            dgvCupones.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

            txtNroSocio.Enabled = false;
            dtpDesde.Enabled = false;
            dtpHasta.Enabled = false;
            cboFormasPago.Enabled = false;
            cboZonas.Enabled = false;

            FindFormasPago();
            FindZonas();         

            txtNroCupon.Focus();
        }

        private void frmCuponConsulta_Load(object sender, EventArgs e)
        {
            IniciarControles();
            GetCupones();
        }

        private void GetCupones()
        {
            try
            {
                var query = (from row in Cupones.FindAllConSocio().OrderByDescending(x => x.numero).Take(100)
                             select new
                             {
                                 row.id,
                                 fecha_emision = row.fecha_emision.ToShortDateString(),
                                 numero = String.Format("{0:00000000}", row.numero),
                                 NroCert = row.socio.numero_certificado,
                                 Socio = row.socio.apellido + ", " + row.socio.nombres,
                                 row.total,
                                 row.estado
                             }).ToList();

                dgvCupones.Rows.Clear();
                foreach (var fila in query)
                {
                    dgvCupones.Rows.Add(fila.id, fila.fecha_emision, fila.numero, fila.NroCert,
                         fila.Socio, fila.total, fila.estado);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            PintarGrilla();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        private void FiltrarForm()
        {
            string numero_cupon = txtNroCupon.Text == string.Empty ? null : txtNroCupon.Text;
            string numero_certificado = txtNroSocio.Text == string.Empty ? null : txtNroSocio.Text;

            DateTime? desde = ckbFechas.Checked ? (DateTime?)dtpDesde.Value : null;
            DateTime? hasta = ckbFechas.Checked ? (DateTime?)dtpHasta.Value : null;

            int? formapago_id = chkFormaPago.Checked ? (int?)cboFormasPago.SelectedValue : null;
            int? zona_id = chkZonas.Checked ? (int?)cboZonas.SelectedValue : null;

            try
            {
                var query = (from row in Cupones.FindAllCondicional(numero_cupon, numero_certificado, desde, hasta, formapago_id, zona_id).OrderByDescending(x => x.numero).Take(100)
                             select row).ToList();

                dgvCupones.Rows.Clear();
                foreach (var fila in query)
                {
                    dgvCupones.Rows.Add(fila.id, fila.fecha_emision.ToShortDateString(), fila.numero, fila.socio.numero_certificado,
                         fila.socio.apellido + ", " + fila.socio.nombres, fila.total, fila.estado);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            PintarGrilla();
        }


        private void PintarGrilla()
        {
            try
            {
                foreach (DataGridViewRow row in dgvCupones.Rows)
                {
                    if (row.Cells[6].Value.ToString() == "I")
                    {
                        row.DefaultCellStyle.BackColor = Color.LightYellow;
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            FiltrarForm();
        }

        private void ckbCertificado_CheckedChanged(object sender, EventArgs e)
        {
            txtNroSocio.Text = string.Empty;

            if (ckbCertificado.CheckState == CheckState.Checked)
            {
                txtNroSocio.Enabled = true;
                txtNroSocio.Focus();
            }
            else
            {
                txtNroSocio.Enabled = false;
            }
        }

        private void ckbFechas_CheckedChanged(object sender, EventArgs e)
        {
            if (ckbFechas.CheckState == CheckState.Checked)
            {
                dtpDesde.Enabled = true;
                dtpHasta.Enabled = true;

                dtpDesde.Focus();
            }
            else
            {
                dtpHasta.Enabled = false;
                dtpDesde.Enabled = false;

                dtpDesde.Value = DateTime.Now;
                dtpHasta.Value = DateTime.Now;
            }
        }

        private void txtNroCupon_TextChanged(object sender, EventArgs e)
        {
            FiltrarForm();
        }

        private void txtNroSocio_TextChanged(object sender, EventArgs e)
        {
            FiltrarForm();
        }

        private void txtNroCupon_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != '-'))
            {
                error.SetError(txtNroCupon, "Solo se permiten números en el campo Nro. Socio.");
                e.Handled = true;
                return;
            }
        }

        private void txtNroSocio_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(ckbCertificado, "Solo se permiten números en el campo Nro. Socio.");
                e.Handled = true;
                return;
            }
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            frmCuponesReporte frm = new frmCuponesReporte(GenerarImpresion());
            frm.Show();
        }

        private List<Cupon> GenerarImpresion()
        {
            List<Cupon> cuponesL = new List<Cupon>();

            try
            {
                foreach (DataGridViewRow fila in dgvCupones.Rows)
                {
                    Cupon cupon = new Cupon();
                    cupon.socio_id = Convert.ToInt32(fila.Cells[3].Value);
                    cupon.socio = Negocio.Socios.FindByCertificado(Convert.ToInt32(fila.Cells["nrocertificado"].Value));
                    cupon.id = Convert.ToInt32(fila.Cells[0].Value);
                    cupon.numero = fila.Cells[2].Value.ToString();

                    cuponesL.Add(cupon);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return cuponesL;
        }

        private void dgvCupones_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (dgvCupones.Rows.Count != 0)
                {
                    int cupon_id = Convert.ToInt32(dgvCupones.Rows[e.RowIndex].Cells[0].Value);

                    frmCuponSeguimiento frm = new frmCuponSeguimiento(cupon_id);
                    frm.MdiParent = this.MdiParent;
                    frm.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FindFormasPago()
        {
            try
            {
                cboFormasPago.ValueMember = "id";
                cboFormasPago.DisplayMember = "forma_pago";
                cboFormasPago.DataSource = FormasPagos.FindAll();
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FindZonas()
        {
            try
            {
                cboZonas.ValueMember = "id";
                cboZonas.DisplayMember = "zona";
                cboZonas.DataSource = Negocio.Zonas.FindAll();
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void chkFormaPago_CheckedChanged(object sender, EventArgs e)
        {
            if (chkFormaPago.CheckState == CheckState.Checked)
                cboFormasPago.Enabled = true;
            else
                cboFormasPago.Enabled = false;
        }

        private void chkZonas_CheckedChanged(object sender, EventArgs e)
        {
            if (chkZonas.CheckState == CheckState.Checked)
                cboZonas.Enabled = true;
            else
                cboZonas.Enabled = false;
        }

        private void dgvCupones_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex.Equals(7))
            {
                try
                {
                    IList<Cupon> cupones = new List<Cupon>();
                    int cupon_id = Convert.ToInt32(dgvCupones.Rows[e.RowIndex].Cells[0].Value);

                    Cupon cupon = Cupones.FindById(cupon_id);
                    cupones.Add(cupon);

                    ImpresionCupones imprimir = new ImpresionCupones(cupones);
                    imprimir.Imprimir();

                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }


    }
}
